package com.example.util;



import com.example.constant.CrowdConstant;
import com.example.exception.LoginFailedException;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.math.BigInteger;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;

public class CrowdUtil {

    /**
     * 判断请求类型
     *
     * @param request
     * @return true=json请求;false=普通页面请求
     */
    public static boolean judgeRequestType(HttpServletRequest request) {
        String accept = request.getHeader("Accept");
        String header = request.getHeader("X-Requested-With");
        return (accept != null && accept.contains("application/json"))
                ||
                (header != null && header.equals("XMLHttpRequest"));
    }


    /**
     * 此方法是用于给字符串进行md5加密的工具方法
     *
     * @param source 传入要加密的内容
     * @return 进行md5加密后的结果
     */
    public static String md5(String source) {

        if (source == null || source.length() == 0) {
            throw new LoginFailedException(CrowdConstant.MESSAGE_STRING_INVALIDATE);
        }

        try {
            //表示算法名
            String algorithm = "md5";

            //得到MessageDigest对象，设置加密方式为md5
            MessageDigest messageDigest = MessageDigest.getInstance(algorithm);

            //将获得的明文字符串转换为字节数组
            byte[] input = source.getBytes();

            //对转换得到的字节数组进行md5加密
            byte[] output = messageDigest.digest(input);

            //设置BigInteger的signum
            //signum : -1表示负数、0表示零、1表示正数
            int signum = 1;

            //将字节数组转换成Big Integer
            BigInteger bigInteger = new BigInteger(signum, output);

            //设置将bigInteger的值按照16进制转换成字符串，最后全部转换成大写，得到最后的加密结果
            int radix = 16;
            String encoded = bigInteger.toString(radix).toUpperCase();

            //返回加密后的字符串
            return encoded;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        //触发异常则返回null
        return null;
    }





    /*
     * 读取返回结果
     */
    private static String read(InputStream is) throws IOException {
        StringBuilder sb = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String line = null;
        while ((line = br.readLine()) != null) {
            line = new String(line.getBytes(), StandardCharsets.UTF_8);
            sb.append(line);
        }
        br.close();
        return sb.toString();
    }
    public final static String IMG_PATH_PREFIX = "static/upload/imgs";

    public static File getImgDirFile( String date){

        // 构建上传文件的存放 "文件夹" 路径
        String fileDirPath = new String("src/main/resources/" + IMG_PATH_PREFIX+"/"+date);

        File fileDir = new File(fileDirPath);
        if(!fileDir.exists()){
            // 递归生成文件夹
            fileDir.mkdirs();
        }
        return fileDir;
    }

    public static ResultEntity<String> uploadPicture(

        MultipartFile imgFile,
        String originalName ){

            // 创建OSSClient实例
            //OSS ossClient = new OSSClientBuilder().build(endPoint,accessKeyId,accessKeySecret);

            // 生成上传文件的目录，按照日期来划分目录
            String folderName = new SimpleDateFormat("yyyyMMdd").format(new Date());

            // 生成上传文件在OSS服务器上保存的文件名,通过uuid生成随机uuid，将其中的“-”删去（替换成空字符串）
            String fileMainName = UUID.randomUUID().toString().replace("-", "");

            // 从原始文件名中获取文件扩展名
            String extensionName = originalName.substring(originalName.lastIndexOf("."));

            // 使用目录、文件主体名称、文件扩展名拼接得到对象名称
            String objectName =  fileMainName + extensionName;


            try {
                // 构建真实的文件路径
                File newFile = new File(getImgDirFile(folderName).getAbsolutePath()+"/"+objectName);
                System.out.println(newFile.getAbsolutePath());

                // 上传图片到 -》 “绝对路径”
                imgFile.transferTo(newFile);

                //msg.setMsg("上传成功!");
                return ResultEntity.successWithData(folderName+"/"+fileMainName + extensionName);//newFile.getAbsolutePath());


            } catch (Exception e){
                e.printStackTrace();
                return ResultEntity.failed(e.getMessage());
            }
//            finally {
//                // 最后关闭OSSClient
//                ossClient.shutdown();
//            }

    }




}
